<!DOCTYPE html>
<html lang="en">
  <head>
    <meta charset="UTF-8" />
    <meta http-equiv="X-UA-Compatible" content="IE=edge" />
    <meta name="viewport" content="width=device-width, initial-scale=1.0" />
    <title>Document</title>
  </head>

  <body>
    <script>
      function Star(uname, age) {
        this.uname = uname;
        this.age = age;
      }
      var ldh = new Star("刘德华", 15);

      console.log(ldh);
      /**
         * 原型链的关系    
         * ←  
        构造函数 Star    prototype →    Star的原型对象
                        construtor   ← Star的原型对象


                        实例化对象 ldh __proto__ 指向star 的原型对象   
         */

      //          ### 1.9 属性的区分 

      // 对象属性的查找往往会涉及到整个原型链，那么应该怎样区分属性是实例自身的还是从原型链中继承的呢？

      // 关于这个问题，前面我们也已经讲解过，是通过`hasOwnProperty( )`函数来完成的，这里我们在简单的复习强调一下。

    
       function Person(name, age) {
              this.name = name;
            }
            //在对象的原型上添加age属性
            Person.prototype.age = 21;
            var p = new Person("zhangsan");
            console.log(p.hasOwnProperty("name")); //true
            console.log(p.hasOwnProperty("age")); //false
    

      // `name`属性为实例属性，在调用`hasOwnProperty`方法时，会返回`true`。`age`属性为原型对象上的属性，在调用`hasOwnProperty`函数时，会返回`false`.

      // 在使用`for...in`运算符，遍历对象的属性时，一般可以配合`hasOwnProperty`方法一起使用，检测某个属性是否为对象自身的属性，如果是，可以做相应的处理。

      // ```js
      // for(var p in person){
      //     if(person.hasOwnProperty(p)){

      //     }
      // }
      // ```
    </script>
  </body>
</html>
